#include "../include/AfficherJeu.h"


void AfficherJeu::render()
{
	// Affichage carte (fond)
	App->Draw(sf::Shape::Rectangle(0,0,monde.getCarte().getTaille().x,monde.getCarte().getTaille().y, sf::Color::Green));
	
		// 1. Batiments
		for( unsigned int i=0; i<monde.getBatiments().size(); i++)
		{
			Batiment *b = monde.getBatiments()[i];
			int X1 = b->getPosition()->x; 
			int X2 = b->getPosition()->x + b->getTaille().x;
			int Y1 = b->getPosition()->y;
			int Y2 = b->getPosition()->y + b->getTaille().y;

			sf::Shape a_afficher;
			///
		//	std::cout<<" Batiment "<<X1<<" -> "<<X2<<" , Y1 "<<Y1<<" -> "<<Y2<<std::endl;

			// Affichage
			switch( b->getType() )
			{
				case FORUM:
					a_afficher = sf::Shape::Rectangle(X1,Y1,X2,Y2, sf::Color::Blue);
					
				break;
				case CASERNE:
					a_afficher = sf::Shape::Rectangle(X1,Y1,X2,Y2, sf::Color::Yellow);
				break;
				default:
					std::cout<<"Erreur - Batiment inconnu lors de l'affichage"<<std::endl;
				break;
			}
			App->Draw( a_afficher);
		}
		// 2. Unites
		for( unsigned int i=0; i<monde.getEntites().size(); i++)
		{
			Entite *e = monde.getEntites()[i];
			float X1 = e->getPosition()->x; 
			float X2 = e->getPosition()->x + e->getTaille().x;
			float Y1 = e->getPosition()->y;
			float Y2 = e->getPosition()->y + e->getTaille().y;

			sf::Shape a_afficher;

			// Affichage
			switch( e->getType() )
			{
				case FORUM:
					a_afficher = sf::Shape::Rectangle(X1,Y1,X2,Y2, sf::Color::Yellow);
					
				break;
				case CASERNE:
					a_afficher = sf::Shape::Rectangle(X1,Y1,X2,Y2, sf::Color::Yellow);
				break;
				default:
					std::cout<<"Erreur - Batiment inconnu lors de l'affichage"<<std::endl;
				break;
			}
			App->Draw( a_afficher);
		}
}

AfficherJeu::AfficherJeu(sf::RenderWindow *_App, std::string _cheminDonnees, Monde &_m) : cheminDonnees(_cheminDonnees), monde(_m)
{
	App = _App;

	// initialisations à NULL
	batimentSelectionne = NULL;
}

void AfficherJeu::afficherSelectionnes()
{
	
	for( unsigned int i=0; i< entitesSelectionnes.size(); i++)
	{
		Entite *e = entitesSelectionnes[i];
		float X1 = e->getPosition()->x; 
		float X2 = e->getPosition()->x + e->getTaille().x;
		float Y1 = e->getPosition()->y;
		float Y2 = e->getPosition()->y + e->getTaille().y;

		sf::Shape a_afficher;

		a_afficher = sf::Shape::Rectangle(X1,Y1,X2,Y2, sf::Color::Red);
		
		// on active l'affiche de contours et on ne dessine pas l'interieur du rectange
		a_afficher.SetOutlineWidth(5);
		a_afficher.EnableFill(false);
		a_afficher.EnableOutline(true);

		App->Draw( a_afficher);
	}
	if( batimentSelectionne != NULL )
	{
		Element *e = batimentSelectionne;
		float X1 = e->getPosition()->x; 
		float X2 = e->getPosition()->x + e->getTaille().x;
		float Y1 = e->getPosition()->y;
		float Y2 = e->getPosition()->y + e->getTaille().y;

		sf::Shape a_afficher;

		a_afficher = sf::Shape::Rectangle(X1,Y1,X2,Y2, sf::Color::Red);
		
		// on active l'affiche de contours et on ne dessine pas l'interieur du rectange
		a_afficher.SetOutlineWidth(5);
		a_afficher.EnableFill(false);
		a_afficher.EnableOutline(true);

		App->Draw( a_afficher);

	}

}

void AfficherJeu::deselectionnerTous()
{
	entitesSelectionnes.clear();
	batimentSelectionne = NULL;
}

void AfficherJeu::selectionner( Bloc blocSelection)
{
	deselectionnerTous();	

	std::vector<Entite*> entites = monde.getEntites();
	for(unsigned int i=0; i<entites.size(); i++)
	{
		if( Carte::collision( blocSelection, *(entites[i])))
		{
			// traiter
			entitesSelectionnes.push_back( entites[i]);

			/*
			std::cout<<"collision en X:"<<Carte::estAligneX(blocSelection, *(entites[i]))<<std::endl;
			std::cout<<"collision en Y:"<<Carte::estAligneY(blocSelection, *(entites[i]))<<std::endl;
			std::cout<<"Collision detectee sur zone de selection :"<<blocSelection.getPosition()->x<<"-"<<blocSelection.getTaille().x<<std::endl;
			std::cout<<"Collision detectee sur zone de selection :"<<(*(entites[i])).getPosition()->x<<"-"<<(*(entites[i])).getTaille().x<<std::endl;
			*/
		
		}
	}


	// Si on a pas selectionne d'entite, on regarde pour les batiments
	if( entitesSelectionnes.size() == 0 )
	{
		std::vector<Batiment*> batiments = monde.getBatiments();
		for(unsigned int i=0; i<batiments.size(); i++)
		{
			if( Carte::collision( blocSelection, *(batiments[i])))
			{
				// traiter
				batimentSelectionne = batiments[i];
				return;
			}
		}
	}
		#if DEBUG
		std::cout<<"Nombre d'entites selectionnees :"<<entitesSelectionnes.size()<<std::endl;
		#endif
}

Entite* AfficherJeu::getEntiteSelectionne(unsigned int i)
{
	if( i < entitesSelectionnes.size())
		return entitesSelectionnes[i];
	else
		return NULL;
}

Batiment* AfficherJeu::getBatimentSelectionne()
{
	return batimentSelectionne;
}

Element* AfficherJeu::getSelectionne( Bloc blocSelection)
{
	std::vector<Entite*> entites = monde.getEntites();
	for(unsigned int i=0; i<entites.size(); i++)
	{
		if( Carte::collision( blocSelection, *(entites[i])))
		{
			// traiter
			return entites[i];

			/*
			std::cout<<"collision en X:"<<Carte::estAligneX(blocSelection, *(entites[i]))<<std::endl;
			std::cout<<"collision en Y:"<<Carte::estAligneY(blocSelection, *(entites[i]))<<std::endl;
			std::cout<<"Collision detectee sur zone de selection :"<<blocSelection.getPosition()->x<<"-"<<blocSelection.getTaille().x<<std::endl;
			std::cout<<"Collision detectee sur zone de selection :"<<(*(entites[i])).getPosition()->x<<"-"<<(*(entites[i])).getTaille().x<<std::endl;
			*/
		
		}
	}


	// Si on a pas selectionne d'entite, on regarde pour les batiments

		std::vector<Batiment*> batiments = monde.getBatiments();
		for(unsigned int i=0; i<batiments.size(); i++)
		{
			if( Carte::collision( blocSelection, *(batiments[i])))
			{
				// traiter
				return batiments[i];
			}
		}

	return NULL;
}
